package tum0r.webengine.models.mapping

import tum0r.webengine.extension.convert
import tum0r.webengine.models.core.Action

/**
 * 说明: 请求方法参数映射数据类
 *
 * 创建者: tum0r
 *
 * 时间: 2021/9/6 11:19
 */
data class MethodParameterMapping(val parametersName: Array<String>, private val targetClass: Array<Class<*>>) {
    /**
     * 获取参数转换后的值
     *
     * @param[value] 值
     * @param[parameterName] 参数名，没有匹配则按照参数下标
     * @param[parameterIndex] 参数下标
     */
    fun getConvertValue(value: Any?, parameterName: String, parameterIndex: Int): Any? {
        var index = -1
        for (i in parametersName.indices) {
            if (parametersName[i] == parameterName) {
                index = i
                break
            }
        }
        if (index == -1) index = parameterIndex
        return if (index in targetClass.indices) targetClass[index].convert(value) else null
    }

    /**
     * 获取所有参数
     *
     * @param[body] HTTP请求参数
     * @param[action] 返回请求的对象
     */
    fun getValues(body: LinkedHashMap<String, Any?>, action: Action<*>): Array<Any?> {
        val size = targetClass.size - 1
        val result = Array<Any?>(size + 1) { null }
        for (index in 0 until size)
            result[index] = getConvertValue(body.getOrDefault(parametersName[index], null), parametersName[index], index)
        result[size] = action
        return result
    }

    /**
     * 获取参数的数量
     */
    fun getSize() = targetClass.size
}